package club.xyes.zkh.ecommerce.service;

import club.xyes.zkh.ecommerce.commons.entity.BaseEntity;
import club.xyes.zkh.ecommerce.commons.exception.ResourceNotFoundException;
import club.xyes.zkh.ecommerce.service.adapter.SingleDependencyMapperAdapter;
import com.github.pagehelper.PageInfo;

import java.util.List;

/**
 * Create by 郭文梁 2019/4/15 0015 15:15
 * BaseService
 * 业务服务组建基类
 *
 * @author 郭文梁
 * @data 2019/4/15 0015
 */
public interface BaseService<T extends BaseEntity> extends SingleDependencyMapperAdapter<T> {
    /**
     * 查询全部对象
     *
     * @return Entity List
     */
    List<T> all();

    /**
     * 分页查询所有对象
     *
     * @param page 页码
     * @param rows 每页大小
     * @return PageInfo With Entity
     */
    PageInfo<T> list(int page, int rows);

    /**
     * 通过ID查找对象
     *
     * @param id ID
     * @return 实体对象
     */
    T get(Integer id);

    /**
     * 通过ID查找对象 若未查找到 则抛出ResourceNotFoundException
     *
     * @param id ID
     * @return 实体对象
     * @throws ResourceNotFoundException 找不到资源时抛出
     */
    T getRequired(Integer id) throws ResourceNotFoundException;

    /**
     * 通过ID更新数据
     *
     * @param o 实体对象
     * @return 更新后的结果
     */
    T updateById(T o);

    /**
     * 保存实体对象
     *
     * @param o 对象
     * @return 保存后的实体对象
     */
    T save(T o);

    /**
     * 保存所有数据
     *
     * @param os 列表
     * @return 保存结果
     */
    List<T> save(List<T> os);

    /**
     * 通过指定的模板条件查找
     *
     * @param query 模板条件
     * @return Entity list
     */
    List<T> findByQuery(T query);

    /**
     * 通过指定的条件模板查询一条数据
     *
     * @param query 条件模板
     * @return 实体对象
     */
    T findOneByQuery(T query);

    /**
     * 通过ID删除对象
     *
     * @param id ID
     * @return 是否删除成功
     */
    boolean deleteById(Integer id);

    /**
     * 获取总数量
     *
     * @return 数量
     */
    int count();

    /**
     * 获取符合条件的记录数量
     *
     * @param query 条件
     * @return 数量
     */
    int count(T query);

    /**
     * 根据条件检查数据是否存在
     *
     * @param query 条件
     * @return 是否存在
     */
    boolean exists(T query);

    /**
     * 通过制定条件删除数据
     *
     * @param query 条件
     * @return 删除的数据数量
     */
    int delete(T query);
}
